package com.yunnuo.system.onlineuser.service.impl;


import com.yunnuo.system.onlineuser.dao.IUserOnlineDao;
import com.yunnuo.system.onlineuser.entity.UserOnline;
import com.yunnuo.system.onlineuser.service.IUserOnlineService;
import com.yunnuo.system.comm.util.Empty;
import com.yunnuo.system.comm.util.page.TableDataInfo;
import com.yunnuo.system.shiro.session.OnlineSessionDAO;
import com.yunnuo.system.users.entity.PageParams;
import org.apache.shiro.session.Session;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;

import javax.persistence.criteria.*;
import java.util.Date;
import java.util.List;

/**
 * 在线用户服务层实现
 * Created by 魏洪福(15064000912@163.com) on  2018/5/25.
 */
@Service
public class UserOnlineServiceImpl implements IUserOnlineService
{
    @Autowired
    private IUserOnlineDao userOnlineDao;

    @Autowired
    private OnlineSessionDAO onlineSessionDAO;

    /**
     * 通过会话序号查询信息
     * 
     * @param sessionId 会话ID
     * @return 在线用户信息
     */
    @Override
    public UserOnline selectOnlineById(String sessionId)
    {
        return userOnlineDao.findOne(sessionId);
    }

    @Override
    public TableDataInfo selectUserOnlineByPageParams(PageParams pageParams, PageRequest pageRequest) {
        TableDataInfo dataInfo=new TableDataInfo();
        Specification<UserOnline> specification=new Specification<UserOnline>() {
            @Override
            public Predicate toPredicate(Root<UserOnline> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
                Path<String> namePath=root.get("loginName");
                String value=pageParams.getSearchValue();
                if(Empty.isNotEmpty(value)){
                    query.where(cb.like(namePath,"%"+value+"%"));
                }
                return null;
            }
        };
        Page<UserOnline> userOnlines=userOnlineDao.findAll(specification,pageRequest);
        dataInfo.setRows(userOnlines.getContent());
        dataInfo.setTotal(userOnlines.getTotalElements());
        return dataInfo;
    }

        /**
         * 通过会话序号删除信息
         *
         * @param sessionId 会话ID
         * @return 在线用户信息
         */
    @Override
    public void deleteOnlineById(String sessionId)
    {
        UserOnline userOnline = selectOnlineById(sessionId);
        if (userOnline != null)
        {
            userOnlineDao.delete(sessionId);
        }
    }

    /**
     * 通过会话序号删除信息
     * 
     * @param sessions 会话ID集合
     * @return 在线用户信息
     */
    @Override
    public void batchDeleteOnline(List<String> sessions)
    {
        for (String sessionId : sessions)
        {
            UserOnline userOnline = selectOnlineById(sessionId);
            if (userOnline != null)
            {
                userOnlineDao.delete(sessionId);
            }
        }
    }

    /**
     * 保存会话信息
     * 
     * @param online 会话信息
     */
    @Override
    public void saveOnline(UserOnline online)
    {
        userOnlineDao.saveAndFlush(online);
    }

    /**
     * 查询会话集合
     * 
     *
     */
    @Override
    public List<UserOnline> selectUserOnlineList()
    {
        return userOnlineDao.findAll();
    }

    /**
     * 强退用户
     * 
     * @param sessionId 会话ID
     */
    @Override
    public void forceLogout(String sessionId)
    {
        Session session = onlineSessionDAO.readSession(sessionId);
        if (session == null)
        {
            return;
        }
        session.setTimeout(1000);
        userOnlineDao.delete(sessionId);
    }

    /**
     * 查询会话集合
     * 
     * @param expiredDate 会话信息
     */
    @Override
    public List<UserOnline> selectOnlineByExpired(Date expiredDate)
    {
        return userOnlineDao.findAll();
    }
}
